16.VBA西暦2000年問題チェック
16−1 はじめに


2000年問題は特に関心なかったが、99年2月始めにJava Scriptを使ったプログラム を作る必要があり、自分のHP「HTML便利帳」の[6.その他][Java Script]から 昔作ったソースをコピーしようと、久しぶりに開いたら日付処理例が「正月まで あと−6万日」と出ており驚いていまった。これは昨年まで正常に動いていたが、 プログラムの中で来年が"00"年になりJava Scriptで訳の判らない計算となった ことが原因です。

ExcelVBAマクロも趣味で休日に100本以上作り、それを会社で多数の人が使って いるが、趣味で作ったものでありそのマクロに2000年問題があり予期せぬ実行結果が 出ても誰からも責められる事は多分ない。しかし自分で作成したマクロは自分が責任を持つ のが当然であり、文献を参考に検証方法を自分で考え実施することにした。今後、 2000年問題でExcelVBAに関係すると思われることをこのページに掲載します。 関心のある方は参考にして下さい。

まだ関心のない方が多いと思われるが、2000/1/1については、多少のトラブルはあるが そんなに社会混乱は起きないだろうと言う見方と、コンピューター社会になり人類 誰も経験していない初めての事態であり、電気や水道が止まり飛行機も落ちる等 この世が終わりになるほど混乱すると言う人もいる。

2000年問題のホームページは沢山あるが、2000年問題とは何かを知りたい方は
Y2K JAPAN (http://www.y2kjapan.com/jp/)に詳しく載っておりオススメします。又このHPは リンク表も非常に充実しています。

16−2 システム時計が正しくセットされるか確認

自分の持っているPC及びExcelが正常に動作するか確認するマクロを作成した。

1.試験内容

下記に示す表をワークシートに作成し、「システム時計」の行に記述の日付に PC内蔵のシステム時計をセットした。その時の「曜日」と「日付」をマクロで取得し、 予め表に作成してある「正解曜日」「正解年齢」と合うか確認する方法で行なった。

(なお、本来ならシステム時計をセット後電源を1度切って正しく保持いるか 確認した方がよいが、面倒なのでセット後直ぐ日付を取得した。この確認 方法でどの程度検証されたか定かでないが、取り敢えず気休めにはなる)

NO システム時計 正解曜日  正解年齢
1 99/04/09 6 54.9596167008898
2 99/09/09 5 55.378507871321
3 99/12/31 6 55.6878850102669
4 2000/01/01 7 55.6906228610541
5 2000/02/28 2 55.8494182067077
6 2000/02/29 3 55.8521560574949
7 2000/03/01 4 55.854893908282
8 2000/04/01 7 55.9397672826831
9 2000/04/22 7 55.9972621492129
10 2000/04/23 1 56
11 2000/04/24 2 56.0027378507871
12 2000/10/01 1 56.4407939767283
13 2000/10/10 3 56.4654346338125
14 2011/01/01 7 66.6913073237509
15 2030/01/01 3 85.6919917864476
16 2038/01/19 3 93.741273100616
(年齢は1944/4/23生まれの人)
※ 年齢確認はマクロ実行中の秒変化を考慮し、少数点以下5桁まででチェック

2.ダウンロ−ド
ここをクリックでダウンロ−ド(6kb)

このファイルはLZH形式の圧縮ファイルです。解凍して使用して下さい
他人への譲渡もOKで自由に使用して下さい。(ただし著作権は放棄していない)

参考16−1:システム時刻の確認及び設定

PC内臓のシステム時刻を変更したい場合、現在の日付・時刻を再セットする必要がある。 下記マクロで容易にセットすることが出来る。

なお、Windowsより変更は「スタート」「設定」「コントロールパネル」「日付と時刻」で行なうのが 一般的である。

Sub y2kset()
Dim kyo As Date
Dim ima As Date
    kyo = Date
    msg = "システム内蔵の日付を変更する場合入力"
    sdate1 = InputBox(msg, "年/月/日指定", kyo)
        If sdate1 = "" Then
            Exit Sub
        End If
    sdate = DateValue(sdate1)
    Date = sdate
'
    ima = Time
    msg = "システム内蔵の時間を変更する場合入力"
    stim1 = InputBox(msg, "時:分:秒指定", ima)
        If sdate1 = "" Then
            Exit Sub
        End If
    stim = TimeValue(stim1)
    Time = stim
     msg = "現在のシステム時計は:" & Chr$(10) & _
                 Date & "  " & Time
     msno = MsgBox(msg, 3, "時刻確認")
        If msno = 7 Then
             y2kset
        ElseIf msno = 2 Then
             Exit Sub
        End If
End Sub
上記マクロにより簡単にシステム日付を変えられるが、 変更した場合は必ず現在の日付に戻す事。 再セットを忘れると思わぬ不具合が発生する可能性ある。失敗談:日付を 2000年にしたままファイルを更新し、そのファイルをサーバーへ送ったが 後で作成日が2000年になっている事に気づき現在日付に戻し再送付した。 しかし、送ったDADAが正常か見ようとすると常に古いファイルが表示され かなり悩んだ。原因はキャッシュ表示が作成日の新しいファイル(作成日2000年) を常に表示した為で、電源を切り再立ち上げをしても直らなかった。 「Tenporary Internet Files」フォルダーに入っているDataを全て消去し解決。
16−3 システム時計の2000年移行確認
下記マクロを実行でメッセージが2000年に変わることを確認。(Sub y2kt2b()は閏年確認)

Sub y2kt2a()
    Date = #99/12/31#
    Time = #23:59:56#
    MsgBox "現在のシステム時計 " & Date & "  " & Time & Chr$(10) & _
           "(約5秒経ってから[OK]をクリックして下さい)"
    MsgBox "現在のシステム時計 " & Date & "  " & Time & Chr$(10) & _
           "(2000/01/01になっていればシステムは正常)"
End Sub
Sub y2kt2b()
    Date = #2000/02/28#
    Time = #23:59:56#
    MsgBox "現在のシステム時計 " & Date & "  " & Time & Chr$(10) & _
           "(約5秒経ってから[OK]をクリックして下さい)"
    MsgBox "現在のシステム時計 " & Date & "  " & Time & Chr$(10) & _
           "(2000/02/29になっていればシステムは正常)"
End Sub
(このマクロはシステム時刻を変えています。要再セット)
16−4 電源OFFを含む2000年移行確認
下記マクロ例164aを実行後PCの電源OFF。1分以上経ってから電源ON にして例164cを実行しメセージが2000年になっている事を確認。 (Sub y2kt2b()は閏年確認)

Sub y2kt3a()
    Date = #99/12/31#
    Time = #23:59:00#
    MsgBox "現在のシステム時計 " & Date & "  " & Time
End Sub
'
Sub y2kt3b()
    Date = #2000/02/28#
    Time = #23:59:00#
    MsgBox "現在のシステム時計 " & Date & "  " & Time
End Sub
'
Sub y2kt3c()
    MsgBox "現在のシステム時計 " & Date & "  " & Time
End Sub
(このマクロはシステム時刻を変えています。要再セット)
16−5 システム日付設定のExcelVersion比較

システム日付は、下記のようにDateステートメントでセット出来る。

Sub y2kt3d()
    Date = #yy/MM/dd#
    MsgBox "現在のシステム時計 " & Date 
End Sub
又は年を4桁
Sub y2kt3e()
    Date = #yyyy/MM/dd# 
    MsgBox "現在のシステム時計 " & Date 
End Sub
下表は、年の指定を2桁又は4桁で行なった場合、ExcelのVersionで 相違があるか調べたのもである。
Excel5.0 Excel95 Excel97 /2000
マクロ記述 書き換わる 結果 マクロ記述 書き換わる 結果 マクロ記述 書き換わる 結果
#1900/01/01#

#1929/01/01#
#00/01/01#

#29/01/01#
実行時
エラ−
 
 
 
 
<
#1900/01/01#

#1929/01/01#
 
 
 
実行時
エラ−
 
#1/1/1900#

#1/1/1929#
 
 
 
実行時
エラ−
 
#1930/01/01#

#1979/01/01#
#30/01/01#

#79/01/01#
#1930/01/01#

#1979/01/01#
#30/01/01#

#79/01/01#
実行時
エラ−
 
#1/1/1930#

#1/1/1979#
#1/1/30#

#1/1/79#
実行時
エラ−
 
#1980/01/01#

#1999/01/01#
#80/01/01#

#99/01/01#
 
OK
 
#1980/01/01#

#1999/01/01#
#80/01/01#

#99/01/01#
 
OK
 
#1/1/1980#

#1/1/1999#
#1/1/80#

#1/1/99#
 
OK
 
#2000/01/01#

#2079/01/01#
 
 
 
 
OK
 
#2000/01/01#

#2079/01/01#
 
 
 
 
OK
 
#1/1/2000#

#1/1/2079#
 
 
 
 
OK
 
#2080/01/01#

#2099/01/01#
 
 
 
実行時
エラ−
 
#2080/01/01#

#2099/01/01#
 
 
 
実行時
エラ−
 
#1/1/2080#

#1/1/2099#
 
 
 
実行時
エラ−
 
#00/01/01#

#29/01/01#
 
 
 
実行時
エラ−
 
 
 
 
<
#00/01/01#

#29/01/01#
#2000/01/01#

#2029/01/01#
 
OK
 
#1/1/00#

#1/1/29#
#1/1/2000#

#1/1/2029#
 
OK
 
#30/01/01#

#79/01/01#
 
 
 
#30/01/01#

#79/01/01#
 
 
 
実行時
エラ−
 
#1/1/30#

#1/1/79#
  97エラ
Excel2000は
1930〜1979
OK
 
#80/01/01#

#99/01/01#
 
 
 
 
OK
 
#80/01/01#

#99/01/01#
 
 
 
 
OK
 
#1/1/80#

#1/1/99#
   
OK
 
Excel2000は
1980〜1999

・Excel5.0で#00/01/01#〜#29/01/01#と記述した場合マクロを実行した時エラーとなる。 それ以外では、全Versionとも#30/01/01#〜#79/01/01#がマクロシートへ記述は出来るが、 そのマクロを実行すると「実行エラー"5"」となる。なお、2030〜2079の4桁は全Version OK。

★Excel2000では、#1/1/30#〜#1/1/99#と記述した場合1930〜1999に変わりExcel97から 改善されています。特に30〜79はExcel97では実行エラ−となったがExcel2000はOK。

※上表で「書き換わる」とは、マクロシートに左列(マクロ記述)を記入した場合自動的に 右列(書き換わる)の表示に変わると言う意味

16−6 インプットボックスへ月/日入力のケース
数年前から下図のインプットボックスに月/日を入力し使用している マクロがある。 年はシステム年が付加されるが、2000年以降も同様か確認。


Sub y2kt4()
     hia = InputBox("「月/日」を入力して下さい", "集計月/日")
      If hia = "" Then
         Exit Sub
      End If
       If IsDate(hia) Then
           hi = CDate(hia)
       Else
           MsgBox "日付を入力して下さい"
           Exit Sub
       End If
       MsgBox hi
End Sub
結果:
現在のシステム日付で実行→[1/4]入力、変数"hi"の値[99/01/04] (Excel5.0、95、97、2000共同じ)

システム日付を2000年に設定→[1/4]入力、変数"hi"の値[2000/01/04] (Excel5.0、95、97、2000共OK)

私のPCには現在Excel5.0が入っていない為、 16-2、16-5、16-6項は知人に依頼し確認した。E.Sさん有り難うございました。 なお、最近はExcel5.0を使用している方が殆どいないと思われるので、以降の 項目はExcel95、97、2000の3Versionを確認します。
16−7 年齢計算マクロ
下記マクロをシステム日付"1999/12/31"と"2000/12/31"の場合実施。

Function tosi(c As Integer)
   Application.Volatile
   tosi = (Now - Cells(c, 2)) / 365.25
End Function
システム日付「1999/12/31」
名前 生年月日 年齢 記事
Aさん 1934/09/09 65 65.3086928346896
Bさん 1950/05/05 49 49.6563998846554
Cさん 1966/11/11 33 33.1362082351003
Dさん 1988/04/23 11 11.6878851687074
Eさん 1990/01/01 9 9.99589338225974
システム日付「2000/12/31」
名前 生年月日 年齢 記事
Aさん 1934/09/09 66 66.3107462861561
Bさん 1950/05/05 50 50.6584533361219
Cさん 1966/11/11 34 34.1382616865668
Dさん 1988/04/23 12 12.6899386201739
Eさん 1990/01/01 10 10.9979468337263


Excel95、Excel97、Excel2000共OK
(記事欄の数値が完全に一致さないのは1年の日数が同じでない関係)
16−8 ファイル作成日順に並び変え
日付順が正確に並び変わるか(下記マクロは降順)

Sub y2kt5()
    Range("B2").Select
    Selection.SortSpecial SortMethod:=xlSyllabary, Key1:=Range("B2"), _
        Order1:=xlDescending, Header:=xlGuess, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom
End Sub
A B
 年齢2.xls 2000/12/31 0:01:28
 y2ktwit.xls 2000/02/29 14:11:18
 年齢.html 1999/12/31 0:00:54
 y2kt1.xls 1999/12/20 14:09:16
 y2kt2.xls 1999/11/11 14:09:50

本表のように新しい作成日が上位で問題なし。(Excel95、Excel97、Excel2000共OK)

※私がHPをサーバーへ送る時使用しているFTPソフトにも「Date」順に並び替える 機能があるが、年表示が2桁で1999年と2000年のファイルがミックスの場合、 表示順が狂っている。(2000年対応をしていないソフトは正確な表示が出来ない)
16−9 日付の比較
下記マクロは"99/12/31"より作成日が、「同じか新しい」場合C列へ"1"を記述

Sub y2kt6()
rc1 = 6    '最終セル
hiz = DateValue("99/12/31")
  For i = 2 To rc1
    If Cells(i, 2) - hiz >= 0 Then
        Cells(i, 3) = 1
    Else
        Cells(i, 3) = 0
    End If
  Next
End Sub
A B
 test2.xls 2000/12/31 0:01:28 1
 y2ktwit.xls 2000/02/29 14:11:18 1
 test1.html 1999/12/31 0:00:54 1
 y2kt1.xls 1999/12/20 14:09:16 0
 y2kt2.xls 1999/11/11 14:09:50 0

本表のように「同じと新しい作成日」を選んでおり問題なし。(Excel95、Excel97、Excel2000共OK)

上記マクロで、("99/12/31")は("1999/12/31")と指定したのと同じ。又("00/12/31")と指定した 場合は上表の"test2.xls"のみC列が"1"となる。なお"00"は"2000"と同じ意味。 年を2桁で指定した場合の実際の年については16−5項参照のこと。
16−10 オートフィルターによる抽出

表1.年/月/日を表示 表2.月/日を表示
※ 表2は、表1と同じDATAで[日付][種類]を月/日にしたケース
下記マクロは、日付の表示形式を表2の「月/日」にしてあるケースを対象に、 「月/日」を変数"dat"に入れフィルターを掛け抽出した例。

Sub y2kt7a()
  dat = "12/31"
    Range("a1").Select
    Selection.AutoFilter Field:="2", Criteria1:=dat
End Sub

年は関係無く抽出するので、上図のごとく4個抽出

(注意:月又は日が1桁の場合1桁で指定、例:dat="2/29"OK、dat="02/29"ダメ)
下記マクロは表1を対象に年も指定して抽出するケース。

※年の指定を"21"でなく4桁の"2021"とすると抽出できません。 同様に1999年を指定する場合は"99"とすること。 年を4桁で抽出できないのはExcel95・97共同様であり、 Excel2000が出たら再確認します。

(メニューから手動で[データ][フィルタ][オートフィルタ] [オプション]で[2021/12/31]と指定した場合は正常に抽出でき問題なし)

Sub y2kt7b()
  dat = "21/12/31"
    Range("a1").Select
    Selection.AutoFilter Field:="2", Criteria1:=dat
End Sub


(注意:月又は日が1桁の場合2桁で指定、例:dat="00/02/29"OK、dat="00/2/29"ダメ)
下記は年/月/日の指定をインプットボックスより行なうマクロ、 なお入力は、"00/12/31"又は"99/12/31"のように年は2桁で行なう事。

Sub y2kt7c()
 msg = "検索する 年/月/日 を入力して下さい"
 dat = InputBox(msg, "検索日入力")
    Range("a1").Select
    Selection.AutoFilter Field:="2", Criteria1:=dat
End Sub
表示形式が「2/29/00」のようになっている場合は、「02/29/00」と月/日/年で入力
(16-1〜16-10)(16-11〜16-19)(16-20〜)

フレ−ム分割非対応の目次へ戻る

PC用眼鏡【管理人も使ってますがマジで疲れません】 解約手数料0円【あしたでんき】 Yahoo 楽天 NTT-X Store

無料ホームページ 無料のクレジットカード 海外格安航空券 ふるさと納税 海外旅行保険が無料! 海外ホテル